firmware design